﻿using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.Graphics;
using System.Collections.Generic;
using System;

namespace BeatingMole
{
    public class CBusListEnemy
    {
        #region "Varialbles"
        private ContentManager _content;
        private SpriteBatch _spriteBatch;
        private GameTime _gameTime;

        private Dictionary<string, Vector2> _xmlMap;                    // XML lưu trữ Danh sách tọa độ các lỗ của map
        private List<CBusEnemy> _listEnemy;                             // Danh sách Enemy của màn chơi
        private CInfoEnemy _enemey;                                     // CInfo Enemy
        private CInfoMap _map;                                          // CInfo Map
        private CBusEnemy _busEnemy;                                    // CBusEnemy                  
        private int _numberEnemysVisible = 1;                           // Số Enemy có thể xuất hiện
        private Random _rnd;
        private float _totalTime;
        private float _delayTime;
        #endregion

        #region "Properties"
        /// <summary>
        /// File XML lưu trữ tọa độ vị trí map
        /// </summary>
        public Dictionary<string, Vector2> XmlMap
        {
            set { _xmlMap = value; }
            get { return _xmlMap; }
        }
        ///// <summary>
        ///// Số lượng Enemy
        ///// </summary>
        //public int NumberEnemys
        //{
        //    set { _numberEnemys = value; }
        //    get { return _numberEnemys; }
        //}
        /// <summary>
        /// CInfoMap
        /// </summary>
        public CInfoMap Map
        {
            set { _map = value; }
            get { return _map; }
        }
        /// <summary>
        /// CInfoEnemy
        /// </summary>
        public CInfoEnemy Enemy
        {
            set { _enemey = value; }
            get { return _enemey; }
        }
        /// <summary>
        /// List Enemy
        /// </summary>
        public List<CBusEnemy> ListEnemy
        {
            set { _listEnemy = value; }
            get { return _listEnemy; }
        }
        #endregion

        #region "Constructor"
        /// <summary>
        /// Khởi tạo có tham số CBusListEnemy
        /// </summary>
        /// <param name="rnd"></param>
        /// <param name="content"></param>
        /// <param name="spriteBatch"></param>
        /// <param name="gameTime"></param>
        public CBusListEnemy(Random rnd, ContentManager content, SpriteBatch spriteBatch, GameTime gameTime)
        {
            _content = content;
            _spriteBatch = spriteBatch;
            _gameTime = gameTime;

            if (content != null)
            {
                _xmlMap = content.Load<Dictionary<string, Vector2>>(@"Resource/Xml/Maps");
            }            
            ListEnemy = new List<CBusEnemy>();
            _enemey = new CInfoEnemy(content);
            _busEnemy = new CBusEnemy(content, spriteBatch, gameTime);
            AddEnemy(rnd, CGlobalVariable.level, content, spriteBatch, gameTime);
        }
        #endregion

        #region "Methods"

        /// <summary>
        /// Phương thức cập nhật của BusListEnemy
        /// </summary>
        /// <param name="gameTime"></param>
        public void UpdateBusListEnemy(GameTime gameTime)
        {
            if (CGlobalVariable.IsPauseGame == false || CGlobalVariable.IsWin == false)
            {
                _rnd = new Random();
                _totalTime += gameTime.ElapsedGameTime.Milliseconds;
                if (_listEnemy.Count == 0)
                {
                    AddEnemy(_rnd, _numberEnemysVisible, _content, _spriteBatch, gameTime);
                }
                for (int i = 0; i < _numberEnemysVisible; i++)
                {
                    _delayTime = _rnd.Next(1, 100);
                    if (_listEnemy[i]._enemy.Status != State.Disapear && _listEnemy[i]._enemy.Status != State.Die)
                    {
                        if (_totalTime >= _delayTime)
                        {
                            _totalTime = 0;
                            _listEnemy[i].Update(gameTime);
                        }
                    }

                    if (_listEnemy[i].Enemy.Status == State.Disapear)
                    {
                        // Delay khoảng thời gian khi Draw kế tiếp
                        if (_listEnemy[i]._enemy.PosImages == _listEnemy[i]._enemy.NumberFrames - 1)
                        {
                            _listEnemy.RemoveAt(i);
                        }
                        if (i == _numberEnemysVisible - 1)
                        {
                            _numberEnemysVisible = _rnd.Next(1, CGlobalVariable.level + 1);
                        }
                        AddEnemy(_rnd, _numberEnemysVisible, _content, _spriteBatch, gameTime);
                    }

                    _listEnemy[i].Update(gameTime);
                } 
            }
        }

        /// <summary>
        /// Phương thức Draw của BusListEnemy
        /// </summary>
        /// <param name="spriteBatch"></param>
        public void DrawBusListEnemy(SpriteBatch spriteBatch)
        {
            for (int i = 0; i < _numberEnemysVisible; i++)
            {
                if (_listEnemy.Count > 0)
                {
                    _listEnemy[i].Draw(spriteBatch);
                }
            }
        }

        /// <summary>
        /// (Nguyễn Kim Nhất Quý)
        /// Thêm Enemy theo loại vào List 
        /// </summary>
        /// <param name="soluong">số lượng Enemy của màn chơi</param>
        /// <param name="content"></param>
        /// <param name="spriteBatch"></param>
        /// <param name="gameTime"></param>
        protected void AddEnemy(Random _rnd, int soluong, ContentManager content, SpriteBatch spriteBatch, GameTime gameTime)
        {
            int _soloaiEnemey = 1;

            for (int i = 0; i < soluong; i++)
            {
                #region "Quy định loại Enemy sẽ được Random theo từng Level"
                switch (CGlobalVariable.level)
                {
                    case 1: _soloaiEnemey = _rnd.Next(1, 3); break;
                    case 2: _soloaiEnemey = _rnd.Next(1, 5); break;
                    case 3: _soloaiEnemey = _rnd.Next(1, 6); break;
                    case 4: _soloaiEnemey = _rnd.Next(1, 9); break;
                }
                #endregion

                #region "Random loại chuột tương ứng với từng Level"
                switch (_soloaiEnemey)
                {
                    case 1:
                        {
                            CBusEnemy1 mouse1 = new CBusEnemy1(content, spriteBatch, gameTime);
                            GetPosMouse(mouse1, _rnd);
                            _listEnemy.Add(mouse1);
                        } break;
                    case 2:
                        {
                            CBusEnemy2 mouse2 = new CBusEnemy2(content, spriteBatch, gameTime);
                            GetPosMouse(mouse2, _rnd);
                            _listEnemy.Add(mouse2);
                        } break;
                    case 3:
                        {
                            CBusEnemy3 mouse3 = new CBusEnemy3(content, spriteBatch, gameTime);
                            GetPosMouse(mouse3, _rnd);
                            _listEnemy.Add(mouse3);
                        } break;
                    case 4:
                        {
                            CBusEnemy4 mouse4 = new CBusEnemy4(content, spriteBatch, gameTime);
                            GetPosMouse(mouse4, _rnd);
                            _listEnemy.Add(mouse4);
                        } break;
                    case 5:
                        {
                            CBusEnemy5 mouse5 = new CBusEnemy5(content, spriteBatch, gameTime);
                            GetPosMouse(mouse5, _rnd);
                            _listEnemy.Add(mouse5);
                        } break;
                    case 6:
                        {
                            CBusEnemy6 mouse6 = new CBusEnemy6(content, spriteBatch, gameTime);
                            GetPosMouse(mouse6, _rnd);
                            _listEnemy.Add(mouse6);
                        } break;
                    case 7:
                        {
                            CBusEnemy7 mouse7 = new CBusEnemy7(content, spriteBatch, gameTime);
                            GetPosMouse(mouse7, _rnd);
                            _listEnemy.Add(mouse7);
                        } break;
                    case 8:
                        {
                            CBusEnemy8 mouse8 = new CBusEnemy8(content, spriteBatch, gameTime);
                            GetPosMouse(mouse8, _rnd);
                            _listEnemy.Add(mouse8);
                        } break;
                }
                #endregion
            }
        }

        /// <summary>
        /// (Nguyễn Kim Nhất Quý)
        /// Random tạo độ cho mỗi lần Draw Enemy
        /// </summary>
        protected void GetPosMouse(CBusEnemy enemy, Random _rnd)
        {
            int _holeRandom = _rnd.Next(1, 12);

            #region "Tránh trùng lặp lỗ khi Draw Enemy"
            // Tránh trùng lặp lỗ khi Draw Enemy
            if (_listEnemy.Count >= 1)
            {
                // Kiểm tra tọa độ hole chuẩn bị Random có trùng với Enemy sắp Random
                if (_xmlMap["pos" + _holeRandom.ToString()] == _listEnemy[_listEnemy.Count - 1]._enemy.PosMouse)
                {
                    if (_holeRandom == 12)
                    {
                        _holeRandom = 1;
                    }
                    else
                    {
                        _holeRandom++;
                    }
                }
            }
            #endregion

            #region "Lấy tọa độ Vector2 của mỗi lỗ tương ứng mới biến random"
            // Lấy tọa độ Vector2 của mỗi lỗ tương ứng mới biến random
            switch (_holeRandom)
            {
                case 1: enemy._enemy.PosMouse = _xmlMap["pos" + _holeRandom.ToString()]; break;
                case 2: enemy._enemy.PosMouse = _xmlMap["pos" + _holeRandom.ToString()]; break;
                case 3: enemy._enemy.PosMouse = _xmlMap["pos" + _holeRandom.ToString()]; break;
                case 4: enemy._enemy.PosMouse = _xmlMap["pos" + _holeRandom.ToString()]; break;
                case 5: enemy._enemy.PosMouse = _xmlMap["pos" + _holeRandom.ToString()]; break;
                case 6: enemy._enemy.PosMouse = _xmlMap["pos" + _holeRandom.ToString()]; break;
                case 7: enemy._enemy.PosMouse = _xmlMap["pos" + _holeRandom.ToString()]; break;
                case 8: enemy._enemy.PosMouse = _xmlMap["pos" + _holeRandom.ToString()]; break;
                case 9: enemy._enemy.PosMouse = _xmlMap["pos" + _holeRandom.ToString()]; break;
                case 10: enemy._enemy.PosMouse = _xmlMap["pos" + _holeRandom.ToString()]; break;
                case 11: enemy._enemy.PosMouse = _xmlMap["pos" + _holeRandom.ToString()]; break;
                case 12: enemy._enemy.PosMouse = _xmlMap["pos" + _holeRandom.ToString()]; break;
            }
            #endregion
        }

        #endregion

    }
}
